perm filename SSAVE[F8,ALS] blob
sn#325057 filedate 1977-12-30 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00010 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 *CHECKERS REV of December 29 1977
C00016 00003 *Player's move
C00028 00004 *-*-*-*-*-*-*-*-*-*
C00040 00005 *-*-*- To move cursor, uses
C00054 00006 * REDM BOK2 INIT
C00064 00007 *-*-INHR Interrupt handler, saves and restores data
C00076 00008 ORG H'1800' SELE
C00109 00009 * NEXT FIND RFJ LFJ RBJ LBJ
C00133 00010 * AFT
C00156 ENDMK
C⊗;
*CHECKERS REV of December 29 1977
*Resident package addresses
JOYT EQU H'0C00'
LINE EQU H'0FDF'
SHCB EQU H'0FE2'
INPF EQU H'0FE3'
WTLN EQU H'0FE5'
TXC EQU H'0FE8'
CMRG EQU H'0FEA'
DBNC EQU H'0FEB'
UPI EQU H'0FFA'
JOYI EQU H'21AD'
IJS EQU H'22DB'
SHL EQU H'27C6'
SHR EQU H'27D3'
PUSH EQU H'40A9'
POPS EQU H'40BC'
SPS EQU H'40D0'
WDG EQU H'4105'
WAUD EQU H'41C8'
WAU1 EQU H'41CC'
CDS EQU H'41D5'
WMS EQU H'4205'
UDAT EQU H'424D'
TRAN EQU H'43CD'
FCS EQU H'43D6'
WAIT EQU H'4501'
TIR EQU H'45DB'
SNE EQU H'46D6'
CLER EQU H'4762'
*Misc. constants
TCMD EQU H'44'
BCMD EQU H'6D'
TCOL EQU H'80' TEXT COLOR
ULIN EQU H'FA'
COM EQU H'8F7'
*RAM assignments
BFLG EQU H'0C20' BUTTON EDGE FLAG
BLNF EQU H'0C21' Blink flag
XBLN EQU H'0C22' X value to blink
YBLN EQU H'0C23' Y value to blink
BCNT EQU H'0C24' Counter used in OKMV
BKMV EQU H'0C25' Data to index book moves
HSAV EQU H'0C26' H save location
PLY0 EQU H'0C28' Place for player's ply depth choice
COL0 EQU H'0C29' Place for color choice(next after PLY0)
SELX EQU H'0C2A' SELE exit (0 norm, 1 M's 1st, -1 P's 1st)
AP20 EQU H'0C2C' ACTM+PASM+9 AT HL=20
XOLD EQU H'0C2D' XCOORD TOUCH POINT (DOUBLE JUMP)
YOLD EQU H'0C2E' YCOORD TOUCH POINT (DOUBLE JUMP)
CFLG EQU H'0C2F' COMPRESSION FLAG FOR PLY REC
OBJ0 EQU H'0C30' Board 1, thru H'0E0F'
TREE EQU H'0E10' Tree data, thru H'0EFF', Player's board f
TRE2 EQU H'0E20' Machine's first board here
TRE3 EQU H'0E3E' PASSED FLAG AT LEVEL 30
TRE5 EQU H'0E50' PLY 5 LOCATION
PLDJ EQU H'0E57' USED FOR TEMP STORE OF TOUCH POINT
PLMD EQU H'0E5B' Used for temp store of player's move inf
PLMV EQU H'0ED0' Overlay region used for player's moves
PLMF EQU H'0EE0' and move numbers
SCOR EQU H'0EF0' SCORE (HI:LO) 14 2 BYTE PAIRS
XPOS EQU H'0F0C' XPOSITION(CURSOR)
YPOS EQU H'0F0F' YPOSITION(CURSOR)
OBJ1 EQU H'0F10' Board 2, thru H'0FAF'
MOBS EQU H'0FB0' Mobility (14 bytes)
RGSV EQU H'0FC8' Register save start (int. update)
*Scratch pad assignments
MAT EQU 0 REGISTER USED FOR MATERIAL
POT EQU 6 REGISTER USED FOR POSITION
HLS EQU H'4' REG TO SAVE HL OFFSET
TEMP EQU H'8'
J EQU H'9'
HU EQU H'A'
HL EQU H'B'
PLOC EQU O'3' LISU value for ACTIVE and PASSIVE
KLOC EQU O'4' LISU value for KING's and special data
ELOC EQU O'5' LISU value for EMPTY's area
ISA EQU O'30' ISAR value for active area
ISP EQU O'34' ISAR value for passive
ISK EQU O'40' ISAR value for kings
ACTM EQU O'46' ISAR VALUE FOR ACTIVE MATERIAL
PASM EQU O'47' ISAR VALUE FOR PASSIVE MATERIAL
ISE EQU O'51' ISAR value foempty (with offset)
*Mimimum ply depths
PLYT EQU H'F0' Playing depth for ABE (neg mob sum)
PLYD EQU H'E8' Playing depth for BETTY
PLYH EQU H'E0' Playing depth for CHARLIE
*SPECIAL CONSTANTS
MSK EQU H'1' X ZOOM BIT MASK (CMRG)
X EQU H'1'
Y EQU H'2'
VX EQU H'3'
VY EQU H'4'
CHT EQU H'3' CURSOR HEIGHT
YTST EQU H'9'
XZOP EQU H'34' LINE FOR RESTORE OF X ZOOM
MAXY EQU H'4D' MAX Y COORD (=H'4F'-CHT)
*Linkage locations
ORG H'1000' Initial operations and questions
DC H'AA'
DC H'55'
DC H'01' BACKGROUND COLOR
DC H'00' BACKGROUND COLOR
DC H'00' SPACES
DC H'00' SPACES
DC H'3119' CH
DC H'0B31' EC
DC H'150B' KE
DC H'0921' RS
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
*-*-
PI CDS CLEAR DISPLAY
PI IJS INITIALIZE JOYSTICK TABLE
LISU 2 For safety only, can be removed later
LISL 6
CLR
XS S
BM QN1 Is clock running?
LI H'81' No, so start it
LR D,A
LIS 2
LR S,A
*-*-*-*- Initial question session
QN1 LIS H'4'
LR 0,A
PI SEDC SET MESSAGE LNGTH&LINE POINTER
DCI SKL
PI WMS WRITE MESSAGE
PI RKB AND DO KEYBOARD READ
CI H'2D'
BZ QN10 Is it Betty?
CI H'31' NO.
BZ QN9 Is it Charlie?
LI PLYT Then it's Abe
BR QN11
QN9 LI PLYH It's Charlie
BR QN11
QN10 LI PLYD It's Betty
QN11 DCI PLY0
ST AND SAVE IT.
DS 0
DS 0 SET FOR BUT TWO LINES
PI CDS CLEAR DISPLAY
PI SEDC SET LINE POINTER
LIS H'5'
COM
AS S
LR S,A SET FOR BUT H'1A' LENGTH
DCI YMF DCO TO MESSAGE START
PI WMS SO WRITE MESSAGE
PI RKB READ KEYBOARD
CI H'2B' Is answer an N?
DCI COL0
CLR
LR 7,A Black plays first always
BZ QN13 N means machine first
COM
ST COL0<=-1, player is black
COM
ST SELX<=??, player first
BR QN14
QN13 ST COL0<=0, machine is black
ST SELX<=??, machine first
QN14 DCI BLKM TABLE OF POSSIBLE MOVES
XDC
DCI PLMV List to verify moves
LIS H'7'
LISU 2
LISL 0
LR S,A SET TRANSFER COUNT
PI TRAN DO TRANSFER
DCI BKMV
CLR
ST Clear Book move index value
DCI CMRG
LI H'65'
ST SET FOR X & Y ZOOM
PI CLER CLER UM1 REGISTERS
DCI UPI DCO TO UPDATE CONTROLS
LIS H'3'
ST SET INTO COUNT
CLR
ST SET FOR FULL INIT
LI INIT:
ST
LI INIT.
ST AND SET ADDRESS
PI WAUD WAIT, THEN UPDATE
LIS H'5'
LR S,A GET TRANSFER COUNT
DCI BDAT SET SOURCE
XDC INTO DC1
DCI UPI+1 DESTINATION
PI TRAN TRANSFER DATA
PI WAUD WAIT, DO UPDATE, RESET ISAR&RET.
PI ENIN NOW ENABLE INTERRUPT
*-*-*- Load SC for initial board
LISU PLOC LOAD SCRATCHPAD AS
LISL 7 FOLLOWS:
CLR
BRDJ LR D,A O'30'=FF
BR7 BRDJ O'31'=F0
COM O'32'=0
LR I,A O'33'=0
LR I,A O'34'=0
SL 4 O'35'=0
LR I,A O'36'=F
LISL 6 O'37'=FF
LIS H'F'
LR I,A
LISU KLOC
LISL H'7'
CLR
BRDK LR D,A O'40' thru O'47' = 0
BR7 BRDK
LI H'18' SET PASSIVE AND ACTIVE MATERIAL
LR D,A COUNTS TO H'18'=D'24' INITIALLY
LR D,A
DCI TRE2
PI SCRD SR to RAM for machine's first move
DCI TREE
PI SCRD SR to RAM for player's first move
PI BORD Generate board image with men
DCI XPOS
CLR
ST SET FOR LEFT MOST
LIS H'3'
ST
CLR
ST
DCI YPOS
ST AND SET FOR TOPMOST
*-*-*-*-*-*-*-*-*-*- Start play
DCI H'8F5'
CLR
ST SET BACKGROUND BLACK
DCI COL0
CLR
XM
BM PMOV Player chose Black
*-*-*- Machine's first move if playing black
LISU 2
LISL 5
LIS H'7' Used as random number
NS S Save last 3 bits
LR 0,A Use this number to select move
DCI BKMV Book move index
SL 4 Save space for second move
SR 1
ST Record first move
DCI PLMV
QN17 LM Get byte record
LR 1,A
QN18 LR A,1
NS 1
BNZ QN19 Is this byte exhausted?
LM Step over byte info
BR QN17 Go to next byte record
QN19 LR 2,A
AI H'FF' Subtract 1
NS 1
LR 1,A byte less rightmost bit
XS 2 This leaves 1 bit in A
DS 0
BP QN18
LR 6,A Save the byte bit
LM Get the byte info
LR 4,A The byte indicator
DCI TRE2 Machine's board is here
LR H,DC
LIS H'C'
ADC
LR A,6
ST
LR A,4
ST
JMP SELE Go to SELE to make move
*Player's move
PMOV PI MWAD Wait, then update
PI MVC Initiate cursor
DCI TREE Player's board is here
LR H,DC
MES0 CLR "YOUR MOVE"
MES1 LR 0,A Identify message
PI WMC Write message
DCI BLNF
CLR
ST
CUR1 PI CURS Initiate cursor
*-*- Now X in 1, Y in 2, byte in 3 and byte # in 4
OKPI DCI PLMV Possible moves listing
OKP1 CLR
XM
BNZ OKP3 An entry found
LR A,5 Byte info
NI H'10' Extract J bit
LIS H'5' "PIECE CAN'T MOVE"
BZ OKP2
LIS H'1' "MUST JUMP"
OKP2 BR MES1 Try again
OKP3 NS 3 Compare
BNZ OKP4 This might be the one
LM A cheap way to index
LR 5,A Save for jump info
BR OKP1 Try again
OKP4 LM Next entry is the byte info
LR 5,A Save it
SR 1
SR 1
NI H'3' Remove the J bit and the direction
XS 4 Does it match?
BNZ OKP1 Try again
DCI PLMD Save data as to starting square
LR A,1 X
ST
LR A,2 Y
ST
LR A,3 BYTE
ST
LR A,4 Byte info
ST
LIS H'3'
COM
DCI BCNT Counter
ST
DCI BLNF Blink flag
LIS H'1' Set on
ST
LR A,1 Save X value
ST in XBLN
LR A,2 Save Y value
ST in YBLN
CUR2 PI CURS
DCI PLDJ STORE POSSIBLE TOUCH POINT
LR A,1
ST
LR A,2
ST
LR A,3
ST
LR A,4
ST
DCI PLMD+2 Restore initial values
LM
LR 3,A for BYTE
LM
LR 4,A and BYTE number
*Now test indicated move for legality
OKMV DCI PLMD Saved data location
LM Get the old X value
COM
INC
AS 1 This gives us the change in X
BNZ OKM01
JMP NON2 ILLEGAL
OKM01 LR 1,A Save the difference
BP OKM1
COM
INC
OKM1 LR 0,A |X|
CI H'2'
BP OKM02
JMP NON3 TOO FAR
OKM02 CLR Anticipate normal move
BNZ OKM2
LI H'10' Set Jump bit
OKM2 LR 6,A save byte info here
LM Get the old Y value
COM
INC
AS 2
LR 2,A Change in Y
BM OKM3
COM
INC
OKM3 AS 0
BNZ NON2 |X||Y|
LR A,2
NS 2
BP OKM4
LIS H'2' Backward bit
AS 6
LR 6,A
OKM4 LR A,1
NS 1
BM OKM5
LIS H'1' Left bit
AS 6
LR 6,A
OKM5 LR A,4 Get initial Byte #
SL 1 Shift it left to position
SL 1
AS 6 Add in the J and Direction bits
LR 6,A Final byte info from cursor
DCI PLMV Possible moves listing
LIS H'8' 7 moves possible
LR 0,A
OKM6 CLR
XM
BZ NONO No more entries
LR 1,A
LM
LR 5,A Save byte info
OKM7 CLR
XS 1
BZ OKM6 Last bit tested
LR 2,A We'll need it again
AI H'FF' Subtract 1
NS 1
LR 1,A Byte with bit removed
XS 2 Get extracted bit
DS 0 Count tries
NS 3 Does it check with 3
BZ OKM7 Not in table entry, try again
LR A,5 But does byte info agree?
XS 6 Compare 6 with table value
BNZ OKM7 No so count remaining bits in 1
LIS H'7' Found, so reorder count
XS 0 order from 0 thru 6
DCI BKMV
ST Save move count for book move entry
PI MWAD DO MY WAIT THEN UPDATE
PI MVC Turn off cursor
PI ENIN NOW ENABLE INTERRUPT
DCI TREE Store final values
LR H,DC
LIS H'C'
ADC
LR A,3
ST Store byte
LR A,6
ST And byte info
*Before going to SELE, we want to
*set the BLINK coordinates to
*match the "CURRENT" position
DCI XBLN DESTINATION
XDC SAVE IN DC1
DCI XOLD DCO TO XPOSITION
LM GET SAME
XDC GET DESTINATION
ST AND SET SAME
XDC SAVE NEW DESTINATION
LM GET OLD Y POSITION
XDC
ST AND RESET TO BLINK THERE
DCI BLNF DCO TO BLINK FLAG
LIS H'1'
ST SET FOR BLINK
JMP SELE
NONO LR A,5
NI H'10' A jump required?
LIS H'2'
BZ NON4
LIS H'1'
BR NON4
NON2 LIS H'2'
BR NON4
NON3 LIS H'3'
NON4 LR 0,A
DCI BCNT
LM
INC
DCI BCNT
ST
BM NON5
JMP MES0
NON5 PI WMC
JMP CUR2
DJMP DCI BCNT SET COUNTER FOR
LI H'82' LARGE NUMBER OF
ST TRIALS
DCI PLMD
XDC
DCI PLDJ
LIS H'4'
LR 0,A
DJMP1 LM GET OLD TOUCH POINT DATA
XDC
ST AND TRANSFER TO PLMD
XDC
DS 0 DECREMENT COUNT
BNZ DJMP1 DONE ENOUGH TRANSFER?
PI MWAD DO MY WAIT, THEN UPDATE
PI MVC TURN CURSOR ON
LIS H'6'
LR 0,A SET FOR "CONTINUE JUMP" MESSAGE
BR NON5 AND DISPLAY SAME
*-*-*- Message writing, uses R0, 1, SC O'24'
* calls UPDATE routine. Message # in 0.
WMC LR K,P SAVE RETURN ADDRESS
PI PUSH PUSH ONTO STACK
DCI H'872'
LI H'82'
ST TURN MESSAGE OBJECT OFF...
DCI HSAV
LR A,HU
ST
LR A,HL
ST
PI MWAD WAIT, THEN UPDATE
DCI WMCA DCO TO MESSAGE ADDRESS START
LR A,0 GET MESSAGE NUMBER
SL 1
AS 0
ADC ADD 3XNUMBER TO DCO
LISU 2
LISL 4 SET ISAR TO O'24'
LM
LR S,A SET MESSAGE LENGTH
LM
LR QU,A
LM
LR QL,A MESSAGE ADDRESS INTO Q
DCI LINE
LIS H'5'
SL 4
ST SET PROPER LINE NUMBER
DCI H'0E5F' DCO TO MESSAGE BUILD AREA
LIS H'7'
SL 4
LR 1,A SET COUNTER
CLR CLEAR ACC
WMC1 ST
DS 1
BNZ WMC1 CLEAR TEXT AREA
PI WAUD WAIT, THEN DO UPDATE
DCI H'872'
LIS H'2'
ST TURN OBJECT ON
LR DC,Q SET ADDRESS INTO DCO
PI WMS WRITE MESSAGE
PI MWAD WAIT, THEN UPDATE
DCI HSAV
LM
LR HU,A
LM
LR HL,A
PI ENIN ENABLE INTERRUPTS ONCE MORE
PI POPS POP RETURN ADDRESS
PK AND RETURN
*-*-*-*-*-*-*-*-*-*
* DATA FOR WMC
*
WMCA DC H'9' YOUR MOVE 0
DC YRMV:
DC YRMV.
DC H'A' MUST JUMP 1
DC MJM:
DC MJM.
DC H'C' ILLEGAL MOVE 2
DC MIM:
DC MIM.
DC H'8' TOO FAR 3
DC TFM:
DC TFM.
DC H'7' MY MOVE 4
DC MYMV:
DC MYMV.
DC H'0A' TRY AGAIN! 5
DC PCMM:
DC PCMM.
DC H'D' CONTINUE JUMP 6
DC CJM:
DC CJM.
DC H'9' I WIN IN 7
DC IWIN:
DC IWIN.
DC H'B' YOU WIN IN 8
DC UWIN:
DC UWIN.
YRMV DC H'0513' YOur move
DC H'0309' UR
DC H'0' SPACE
DC H'2913' MO
DC H'2F0B' VE
MJM DC H'2903' MUst jump
DC H'2107' ST
DC H'0' SPACE
DC H'1703' JU
DC H'2925' MP
DC H'04' !
MIM DC H'0127' ILlegal move
DC H'270B' LE
DC H'1B11' GA
DC H'2700' L SPACE
DC H'2913' MO
DC H'2F0B' VE
TFM DC H'0713' TO far
DC H'1300' O SPACE
DC H'1D11' FA
DC H'0904' R!
MYMV DC H'2905' MY move
DC H'0' -
DC H'2913' MO
DC H'2F0B' VE
PCMM DC H'0709' TRY AGAIN!
DC H'0500'
DC H'111B'
DC H'1101'
DC H'2B04'
CJM DC H'3113' CONTINUE JUMP
DC H'2B07'
DC H'012B'
DC H'030B'
DC H'0'
DC H'1703'
DC H'2925'
IWIN DC H'0100' I WIN IN
DC H'0D01'
DC H'2B00'
DC H'012B'
DC H'0'
UWIN DC H'0513' YOU WIN IN
DC H'0300'
DC H'0D01'
DC H'2B00'
DC H'012B'
DC H'0'
*-*-*- Read keyboard
RKB LR K,P Read keyboard
PI PUSH
LISU 2
LISL 4 SET ISAR FOR DELAY TIMER
LIS H'0'
LR S,A SET FOR MAX DELAY
RKB1 PI FCS FETCH CHARACTER
BZ RKB1 NULL INPUT?
BM RKB1 NO. DEBOUNCED INPUT?
PI POPS YES. POP RETURN ADDRESS
LR A,8 GET KEYBOARD INPUT
PK AND RETURN
*-*-*- Initial moves for black
BLKM DC B'11110000' 4 pieces
DC B'00000100' Byte 1, RF
DC B'11100000' 3 pieces
DC B'00000101' Byte 1, LF
DC B'01000000' 11-15 repeat to give
DC B'00000100' a slight preference
DC H'00'
*-*-*- Generate board image
BORD LR K,P
CLR
COM
LR 3,A REG3=FF
DCI OBJ0 BRD1 START ADDRESS
LIS H'2' FLAG FOR BOR
LR 4,A SET REG 4 = 2
LIS H'6'
BRD4 LR 0,A REG0 = 6 ROWS
BRD3 LIS H'A'
LR 1,A REG 1 = 10 LINE/ROW
BRD2 LIS H'4'
LR 2,A REG2=SQ PAIRS/ROW
BRD1 LR A,3
ST STORE IN BRD
COM
ST NEXT IS COMPL. OF FIRST
DS 2
BNZ BRD1 MORE FOR THIS ROW
DS 1 NO, ALL LINE DONE
BNZ BRD2
LR A,3 DONE A TIMES YET
COM
LR 3,A
DS 0 DEC ROW COUNT
BNZ BRD3 ALL ROWS DONE?
DS 4
BZ BRD5 BOTH OBJECTS DONE?
DCI OBJ1 NO,GET BORD2 ADDRS.
LIS H'2'
BR BRD4 REG0=2
*-*-*- Now put pieces in image
BRD5 LISU 3 Pieces are here
LIS H'1' 1 for red pieces (stored first)
LR 4,A Piece, (1 Red, 0 Black, -1 King)
DCI COL0
CLR CLEAR ACC
XM IN W/STATUS
LR 0,A
LISL O'7' Decrement and shift right
BNZ MEN1 if COL0 is FF (BLACK at bottom of scree
LISL O'0' Increment and shift left
MEN1 LIS H'3' if COL0 is 0 (Black at top of screen)
LR 1,A To count bytes
MEN2 LIS H'7'
LR 2,A To count bits
DCI TAB1 Byte location table
LR A,1 This byte number
SL 1 Locations occupy 2 bytes each
ADC
LM Get the byte location
LR QU,A and save it in Q
LM
LR QL,A
LR A,0
NS 0
BNZ MEN5 Decrement and shift right if COL0 is FF
LR A,I Increment and shift left if COL0 is 0
BR MEN4
MEN3 LR A,3
SL 1 and shift left
MEN4 LR 3,A
NI H'80' (done this way for symry
BZ MEN9
BR MEN8
MEN5 LR A,D Decrement if COL0 is FF
BR MEN7
MEN6 LR A,3
SR 1 and shift right
MEN7 LR 3,A
NI H'1'
BZ MEN9
MEN8 DCI TAB2 Relative-locations-of-squares table
LR A,2 This square
ADC
LM Get square displacement
LR DC,Q Recall the location for the input byte
ADC This is the square position
LR A,4 Identify type of piece
NS 4
BM PUTK To put down a king
LIS H'4' Prepare for a piece
LR 5,A To count lines
LI H'20' Skip the rst 4 lines (4*8)
ADC
XDC
DCI BLKP Anticipate a black piece
BZ PUTL A black piece (status bit still ok)
DCI REDP No, it's a red piece
BR PUTL
PUTK LIS H'2' Only 3 lines for a crown
LR 5,A
LIS H'8' To skip 1 line
ADC
XDC
DCI KING
PUTL LM Put loop
XDC
ST
LIS H'7' To next line on screen (less increment)
ADC
XDC
DS 5
BP PUTL Loop
MEN9 DS 2
BM ME10
LR A,0
NS 0
BNZ MEN6 Shift right if COL0 is FF
BR MEN3 Shift left if COL0 is 0
ME10 DS 1
BP MEN2
LR A,4
NS 4
BM BDEX Exit from board routine
DS 4
BP MEN1 Go round again for black pieces
LISU H'4' Get set for kings
LR A,0
NS 0
LISL H'3' Decrementing case
BNZ MEN1 Dedrement and shift right if COL0 is FF
LISL H'0' Incrementing case
BR MEN1 Increment and shift left if COL0 is 0
BDEX PK
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
* UPDATE CONTROL DATA *
*
BDAT DC H'1' FLAG SET SHORT UPDATE
DC UDIT:
DC UDIT.
DC UDIT:
DC UDIT.
* Set message length and line pointer
SEDC DCI LINE DCO TO LINE POINTER
LIS H'2'
SL 4 SET FOR SECOND LINE
ST
LR A,0
SL 4
LISL 4
LR S,A AND SET MESSAGE LENGTH
CLR CLEAR ACC
LR 1,A AND SET DEFAULT RESULT
POP AND RETURN
*-*-*- Address table for MVC*
TABL DC H'0C30'
DC H'0C80'
DC H'0CD0'
DC H'0D20'
DC H'0D70'
DC H'0DC0'
DC H'0F10'
DC H'0F60'
*-*-*- To move cursor, uses
*SC0,1,2,3,4,HU,Q,K,W, SC20-24.
CURS LR K,P
PI PUSH AND PUSH IT ON TO STACK
MAP0 PI MWAD WAIT, THEN UPDATE
LIS H'1' CAN START JOYREAD
LR HU,A SET FOR HORIZONTAL POT
PI JOYI AND READ
LR VX,A SAVE RESULT IN VX
LIS H'0'
LR HU,A SET FOR VERTICAL POT
PI JOYI
LR 0,A SAVE IN REG 0
PI AMAP CONVERT TO PROPER VELOCITY
LR VY,A SAVE RESULT
LR A,VX
LR 0,A NOW GET UNCOVERTED VX INTO R0
PI AMAP CONVERT IT
LR VX,A AND SAVE IT
PI MWAD WAIT, THEN UPDATE
PI BLNK To blink code (on)
LIS H'4'
LR 0,A
MP01 PI MWAD A second wait
DS 0
BNZ MP01
PI BLNK To blink code (off)
CLR CLEAR ACC
XS VX VX IN W/STATUS
BZ MAP7 NON-NULL X COMPONENT?
DCI XPOS YES
LM
LR X,A SET CURRENT X POSITION
LISU 2
LISL 0
CLR
LR I,A SP20<=0
LM
LR I,A SP21<=NON NULL LEAD MASK
LM
LR S,A SP22<=TRAILING MASK
CLR
XS VX VX IN W/STATUS
BM MAP3 GOING LEFT?
PI SHR SHIFT RIGHT ONE
LIS H'7' NO, GOING RIGHT.
XS X
BNZ MAP5 IN RH MOST BOX?
LISL 2 YES
XS S
BZ MAP5 TRIED TO GO TOO FAR?
MAP2 CLR YES.
LR VX,A CLEAR X VELOCITY
BR MAP7 AND CHECK Y
MAP3 PI SHL SHIFT LEFT ONE
CLR
XS X
BNZ MAP4 IN LH MOST BOX?
LISL 0 YES
XS S
BNZ MAP2 TRIED TO GO TOO FAR?
MAP4 LISL 0
CLR
XS S
BZ MAP7 IS SP20 NULL?
LISL 1 NO.
LR A,I
LR S,A
LISL 0
LR A,I
LR D,A
CLR
LR S,A SP22<=SP21,SP21<=SP20,SP20<=0,THAT ORDER
DS X AND DECREMENT X COUNT
BR MAP7 NOW GO CHECK Y
MAP5 LISL 1
CLR CLEAR ACC
XS S
BNZ MAP7 IS SP21=0?
LISL 2
LR A,D
LR I,A
CLR
LR D,A SP21<=SP22,SP22<=0, THAT ORDER
LIS H'1'
AS X
LR X,A INCREMENT X COUNT
MAP7 CLR
XS VY
BZ MAP9 VY=0?
DCI YPOS NO, SET DCO TO LAST Y POSITION
AM UPDATE Y COORD
BM MP7A Result Y is neg?
CI MAXY COMPARE W/MAX ALLOWED Y
BC MAP8 NEW Y>MAX ALLOWED VALUE?
MP7A CLR YES
LR VY,A RESET VY
BR MAP9
MAP8 LR Y,A SET NEW Y
MAP9 LR A,VY GET VY
SL 1
XS VX
BZ MP12 ANY MOVEMENT?
PI MVC YES, REMOVE OLD POSITION
CLR
XS VY
BZ MP10 ANY Y MOVEMENT?IF NOT, MUST HAVE VX NE 0
DCI YPOS
LR A,Y IS, SO RESET
ST Y POSITION
CLR
XS VX
BZ MP11 ANY X MOVEMENT?
MP10 DCI XPOS UPDATE X POSIT & MASK
LR A,X
ST
LISL 1
LR A,I
ST
LR A,S
ST
MP11 PI MVC DISPLAY NEW POSITION
MP12 CLR
OUTS 1 Clear port 1
NOP 3 NOP's for FCC
NOP Do not remove
NOP for any reason
INS 1 Get buttons
NI H'1' Strip to desired one
DCI BFLG To button flag
CLR
BNZ MP13 Any button input?
ST No, reset edge flag
MP14 JMP MAP0 And go try again
MP13 LR Q,DC Save address
XM Flag in W/STATUS
BNZ MP14 Previous input?
LIS H'1' No, reset flag
LR DC,Q Recover address
ST And reset
CON CLR
LR 0,A Set counter (Y conversion)
CON1 LR A,Y Get Y coordinate
CI YTST Compare W/test value
BC CON2 Y LE test value?
LR A,0 No, increment counter
INC
LR 0,A
LI -H'A'
AS Y
LR Y,A Y<=Y-H'A'
BR CON1 Go back and try agian
CON2 LR A,0 Get counter
LR Y,A Y now↑(0-7):(top-bottom)
AS X
NI H'1'
BZ MP14 On a legal square?
DCI COL0 Yes
CLR
XM Flag in W/STATUS
BP CON3 Machine plays RED?
LIS H'7' Yes
XS Y
LR Y,A Y<=7-Y
LIS H'7'
XS X
LR X,A X<=7-X
CON3 LR A,Y
SR 1
LR VY,A VY reg (BYTENO)<=(1/2*(7-Y)
DCI BYDT To BYTE data
LR A,X Get X coord.
ADC Add offset to base address
LM Get byte
LR VX,A Save byte into VX reg
DCI XOLD
LR A,X
ST
LR A,Y
ST SAVE CONVERTED CO-ORDINATES
PI MWAD WAIT, THEN UPDATE
PI ENIN ENABLE INTERRUPT DRIVEN UPDATE
PI POPS POP RETURN ADDRESS
PK AND RETURN
*-*-*- Data for byte values (X coord. conversions)
BYDT DC H'0880'
DC H'0440'
DC H'0220'
DC H'0110'
*-*-*- MVC Set or remove cursor
MVC LR K,P SAVE RETURN ADDRESS
DCI XPOS
LM
LR 0,A SAVE X IN R0
LISU 2
LISL 3
LM
LR I,A
LM
LR D,A LEAD IN SP23,TRAIL IN SP24
CI YPOS
LM GET Y COORDINATE
DCI H'0C30' DCO TO OBJ0 BASE ADDRESS
ADC ADD 8 X Y COORD (W/MAX FOR Y
ADC OVER H'40', CANNOT USE "CUTE"
ADC TRICKS HERE--AND FOR SPEED,
ADC WE JUST USE STRAIGHT ADC'S).
ADC
ADC
ADC
ADC
LR A,0 GET X OFFSET
ADC AND ADD IT IN
LIS CHT
LR 0,A SET COUNT FOR TRANSFER
MVC1 LR Q,DC SAVE ADDRESS IN Q REG
LR A,QU GET HO ADDRESS
CI H'E'
BNZ MVC2 AT BOTTOM OF OBJ0
LR A,QL DEFINITELY.
CI H'F'
BC MVC2 PAST BOTTOM?
LIS H'F' YES.
LR QU,A RESET HO ADDRESS
LR DC,Q AND RESET DCO ACCORDINGLY (FOR OBJ1)
MVC2 LR A,I GET LEAD MASK BYTE
LR Q,DC SAVE DCO
XM XOR IN CURSOR
LR DC,Q RECOVER ADDRESS
ST AND RESET THAT BYTE
LR Q,DC SAVE ADDRESS AGAIN
LR A,D GET TRAILING MASK BYTE
XM XOR IN BITS
LR DC,Q RECOVER ADDRESS
ST AND RESET DATA
LIS H'6'
ADC SET TO NEXT DESTINATION
DS 0 DECREMENT COUNTER
BNZ MVC1 DONE?
PK YES, RETURN
*-*-*- AMAP Mapping joystick readings to velocities
AMAP LR A,0 GET READING
CI H'40'
BNC AMP1 VAL LE H'40'?
LI H'FF' YES.
BR AMP2
AMP1 CI H'C0'
CLR
BC AMP2 VAL GT H'C0'=D'192'
LIS H'1' YES, VELOCITY = 1
AMP2 POP RETURN
*-*-*- BLNK Blinking routine
BLNK LR K,P
DCI BLNF Test BLINK flag
CLR
XM
BZ BLN4 Need to blink?
LISU 2
LISL 3
LM Yes
LR I,A Get X value
LM
LR D,A and Y value to blink
DCI COL0
CLR
XM
BZ BLN0 Need to reverse?
LIS H'7'
XS S
LR I,A
LIS H'7'
XS S
LR D,A
BLN0 DCI H'0C30'-H'50' DC0 TO OBJ0-H'50'
LISL 4
LIS H'5'
SL 4
BLN1 ADC Add off-set
DS S
BP BLN1 Added enough?
LR Q,DC Yes
LR A,QU Get H0 address
CI H'E'
BNZ BLN2 Need reset?
LIS H'F' Yes
LR QU,A
BLN2 LR DC,Q
LISL 3
LR A,S
ADC Add off-set
LIS H'3'
LR 0,A Set counter
BLN3 LR Q,DC
LI H'C0'
XM
LR DC,Q
ST
LIS H'7'
ADC Next one to blink
DS 0 Decrement counter
BNZ BLN3 Done?
BLN4 PK
* REDM BOK2 INIT
*-*-*- Initial moves for red
REDM DC B'00000111' 3 pieces
DC B'00001010' Byte 2, RB
DC B'00001111' 4 pieces
DC B'00001011' Byte 2, LB
DC H'00'
*-*-*-*-*-*-*-*-*-*
*First replies (maximum of 4 each)
BOK2 DC H'33' 24,20 24-20 To 12-16
DC H'33' 24-20, 24-20
DC H'43' 23-19, 24-20 To 11-15
DC H'20' 22-17, 24-19
DC H'22' 22-17, 22-17 To 10-14
DC H'22' 22-17, 22-17
DC H'55' 22-18, 22-18 To 9-13
DC H'55' 22-18, 22-18
DC H'31' 24-20, 23-18 To 11-16
DC H'45' 24-19, 22-18
DC H'66' 21-17, 21-17 To 10-15
DC H'66' 21-17, 21-17
DC H'55' 22-18, 22-18 To 9-14
DC H'55' 22-18, 22-18
*-*-*-
INIT DC H'30'
DC H'10' OBJ1 L.O. RP
DC H'5F' TEXT LOW ORDER ROM
DC H'8C' OBJ0 H.O.RP+OLOR
DC H'8F' OBJ1 H.O.RP
DC H'EE'
DC H'08' OBJ0 DELTA X ---
DC H'08' OBJ1 DELTA X---
DC H'70' TEXT OBJECT DELTA X
TY0 DC H'3C' OBJ0 DELTA Y ----
DC H'14' OBJ1 DELTA Y ---
DC H'07' TEXT OBJECT DELTA Y
DC H'0D' OBJ0-X-CO
DC H'0D' OBJ1 X-CO
DC H'1C' TEXT OBJECT X COORD
DC H'48' OBJ0 Y-VALUE L.O.A
DC H'C0' OBJ1 Y-VALUE L.O.A
DC H'26' TEXT OBJECT Y VAL LO A
DC H'00' OBJ0 Y-VALUE H.0 &X-ORDER
DC H'01' OBJ1- Y-VAL H.O.$X-ORDER
DC H'82' TEXT OBJ INITIALLY OFF
UDIT DC H'30'
DC H'10'
DC H'5F'
DC H'8C'
DC H'8F'
DC H'EE'
DC H'3C'
DC H'14'
DC H'07'
TAB1 DC H'0F10' BYTE 3
DC H'0D70' BYTE 2
DC H'0CD0' BYTE 1
DC H'0C30' BYTE 0
TAB2 DC D'86' RELATIVE SQUARE POSITION TABLE
DC D'84'
DC D'82'
DC D'80'
DC D'07'
DC D'05'
DC D'03'
DC D'01'
*-*-*- YMF
YMF DC H'0513' Y0
DC H'0300' U-
DC H'2913' MO
DC H'2F0B' VE
DC H'00' -
DC H'1D' F
DC H'0109' IR
DC H'2107' ST
DC H'00' -
DC H'35' ?
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'0500' Y-
DC H'1309' OR
DC H'00' -
DC H'2B' N
*-*-*-*-*-*-*-*-*-*-*-*-*-
*-*-*- SKL Skill text
SKL DC H'0713' TO
DC H'00' -
DC H'2527' PL
DC H'1105' AY
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'0705' TY
DC H'250B' PE
ABE DC H'0913' RO
DC H'2D13' BO
DC H'0700' T-
DC H'112D' AB
DC H'0B00' E-
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'11' A
BETY DC H'0913' RO
DC H'2D13' BO
DC H'0700' T-
DC H'2D0B' BE
DC H'0707' TT
DC H'05' Y
DC H'00' -
DC H'00' -
DC H'00' -
DC H'00' -
DC H'2D' B
CHAS DC H'0913' RO
DC H'2D13' BO
DC H'0700' T-
DC H'3119' CH
DC H'1109' AR
DC H'2701' LI
DC H'0B' E
DC H'00' -
DC H'00' -
DC H'31' C
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*MWAD*-WAIT, THEN UPDATE, AND KEEP THE*
*-*-*-*X ZOOM BIT SET PROPERLY DURING *
*-*-*-*DISPLAY MAINTENANCE.*-*-*-*-*-*-
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
MWAD LR K,P SAVE RETURN ADDRESS
PI PUSH AND PUSH ONTO STACK
PI DAI DISABLE INTERRUPTS
PI WAIT WAIT ON APPROPRIATE LINE
DCI CMRG DCO TO PROG COPY COMREG
LI MSK MASK IN
XM TURN OFF XZOOM
DCI H'8F7' IN THE UM1 COPY
ST ONLY
PI UDAT NOW DO UPDATE
LI XZOP SET LINE FOR RESTORE XZOOM
MWD1 DCI H'8FB' DCO TO CURRENT LINE
CM COMPARE
BNZ MWD1 REACHED IT YET?
DCI CMRG YES
LM
DCI H'8F7' NOW RESET UM1 COPY
ST
PI POPS POP RETURN ADDRESS
PK AND RETURN
*-*-*- Interrupt enable for update
ENIN LI INHR:
OUTS H'C'
LI INHR.
OUTS H'D' SET INTERRUPT VECTOR
DCI H'8F0'
LI ULIN
ST SET INTERRUPT LINE
DCI CMRG DCO TO PROG COPY COMREG
LR Q,DC SAVE ADDRESS IN Q RES
LIS H'8'
OM
LR DC,Q
ST IN PROGRAM COPY
DCI H'8F7'
ST DITTO UM1 COPY
LIS H'1'
OUTS H'E' ENABLE SMI...
EI ENABLE CPU
LR J,W SAVE SAME STATUS
POP AND RETURN
*-*-*- Interrupt disable
DAI DI DISABLE CPU INTERRUPT
LR J,W SET J ACCORDINGLY
DCI CMRG DCO TO PROG COPY COMREG
LR Q,DC SAVE ADDRESS
LIS H'8'
COM
NM TURN OFF BIT
LR DC,Q IN THE
ST PROGRAM COPY,
DCI H'8F7'
ST AND THE UM1 COPY
CLR
OUTS H'E' NOW DISABLE SMI
POP AND RETURN
*-*-*-* SCRD SCRATCHPAD TO RAM DIRECT
*
SCRD LR K,P SAVE RETURN ADDRESS
LISU PLOC
LISL 0
SCD1 LR A,I
ST
BR7 SCD1
LR A,I
ST
LISU KLOC
SCD2 LR A,I
ST
BR7 SCD2
LR A,I
ST
PK DONE, SO RETURN
*-*-INHR Interrupt handler, saves and restores data
INHR LR 8,A SAVE ACC
LR A,IS
LISU 6
LISL 0
LR I,A SAVE ISAR IN REG O'60'
LR A,HU
LR I,A SAVE HU IN REG O'61'
LR A,HL
LR I,A SAVE HL IN REG O'62'
LR A,J
LR I,A SAVE J REG IN REG O'63'
LR H,DC SAVE OLD DCO
DCI RGSV DCO TO SAVE AREA START
LR A,HU
ST
LR A,HL
ST SAVE OLD DCO IN RGSV,RGSV+1
XDC
LR H,DC
XDC
LR A,HU
ST
LR A,HL
ST SAVE OLD DC1 IN RGSV+2,RGSV+3
LR A,KU
ST
LR A,KL
ST SAVE K REG IN RGSV+4,RGSV+5
LR K,P PC1 INTO K REGISTER
LR A,KU
ST
LR A,KL
ST PC1 INTO RGSV+6,RGSV+7
LR J,W SAVE OLD STATUS
LISU 2
LISL 3
INH2 LR A,D
ST SP23,22,21,20 IN, RESP.
BR7 INH2 RGSV+8,+9,+A,+B
DCI CMRG DCO TO COMMAND REGISTER
LI MSK MASK ON
XM TURN OFF X ZOOM BIT
DCI H'8F7' IN THE UM1
ST COMMAND REGISTER
PI UDAT UPDATE UM1 DISPLAY REGISTERS
LI XZOP SET LINE FOR XZOOM ON
INH1 DCI H'8FB' DCO TO CURRENT Y LO
CM COMPARE
BNZ INH1 DIFFERENT?
DCI CMRG NO. RESTORE X ZOOM
LM FROM OLD COPY
DCI H'8F7' TO THE UM1 COPY
ST
*
* RESTORE ALL REGISTERS
*
DCI RGSV DCO TO SAVE AREA
LM
LR HU,A
LM
LR HL,A OLD DCO TO H REG
XDC
LR DC,H NOW INTO DCO
XDC AND INTO DC1
LM
LR HU,A
LM
LR HL,A OLD DC1 INTO H REGISTER
LIS H'2'
ADC BYPASS K FOR A MOMENT
LM
LR KU,A
LM
LR KL,A
LR P,K RESTORE PC1
LISU 2
LISL 3
INH3 LM RESTORE SP20-23 FROM
LR D,A RGSV+8,+9,+A,+B
BR7 INH3
DCI RGSV+4
LM
LR KU,A
LM
LR KL,A RESTORE K REGISTER
LR DC,H RESTORE DC1
XDC AND SET DCO&DC1 PROPERLY
LR W,J NOW RESTORE STATUS AT ENTRY
*
* NOW RESTORE J,H,A FROM SCRATCH PAD
*
LISU 6
LISL 3
LR A,D GET J
LR J,A
LR A,D GET HL
LR HL,A
LR A,D
LR HU,A RESTORE HU
LR A,D GET ISAR
LR IS,A RESTORE ISAR
LR A,8 RESTORE A
EI INT. ENABLE
POP
*-*-*-
WAST LR K,P Delay loop to WASTE some time
WAS2 LIS H'F'
LR 1,A
WAS3 CLR
LR 2,A
WAS4 DS 2
BNZ WAS4
DS 1
BNZ WAS3
PK
*
STOP DCI SCOR What kind of score?
LM
CI H'3F' Does the machine have a win?
BNZ STO1 No
LM Yes, at what ply?
COM
INC
LR 4,A
LIS H'7' "I can win in "
BR STO2
STO1 CI H'C1' Does player have a win?
BNZ STO6 No
LM Yes, at what ply?
LR 4,A
LIS H'8' "You can win in "
STO2 LR 0,A
PI WMC Write message
PI MWAD Wait then update
LR A,4
CI H'9'
BC STO5 OVER 9?
LIS H'9' YES, SET TO 9
LR 4,A SET NUMBER IN R4
STO5 LR TEMP,A
PI WDG Report ply
PI MWAD Wait then update
PI ENIN Enable interrupts
CLR
LR 3,A
STO3 PI WAST Leave message up awhile
DS 3
BNZ STO3
LR A,4
CI H'2' Early warning only?
BC STO4
STO6 JMP AFTT YES
STO4 PI MWAD Do wait, then update
DCI H'872'
LI H'82'
ST TURN MESSAGE OFF
LR A,0 Get message type
LR 6,A And save in REG 6
ZS0 LIS H'D'
LR 1,A Set NOTE COUNT (14 NOTES)
ZS1 LIS H'7' Set mask
XS 6
DCI TUN2 Default tune--for Player win
BNZ ZS2 Computer wins?
DCI TUN1 Yes, set tune accordingly
ZS2 LR A,1 Get current NOTE COUNT
SL 1
AS 1 Mult by three for proper offset
ADC And add it in
LISU 4
LISL 4
LM Get DELTA LINE count
LR D,A Into SP44
LM
LR S,A Get LEVEL into SP43
LM And get DURATION into
LR 5,A REG 5
PI SNE Enable sound
ZS3 PI WAUD And wait
DS 5 Decrement DURATION
BNZ ZS3 Done with NOTE?
DS 1 Yes, decrement NOTE COUNT
BP ZS1 Done all of SONG?
LI H'A0' YES
LR 1,A Set counter
ZS4 PI MWAD Delay
DS 1 For approximately
BNZ ZS4 2.7 Seconds
JMP H'4000' And return to RESIDENT
FLSH DCI SELX DCO TO MOVE NUMBER
LIS H'2'
CM
BC FLS5 PAST BOOK MOVES?
PI BORD NO, JUST DISPLAY BOARD
FLS6 JMP PMOV AND GO PLAYERS MOVE
FLS5 PI MWAD WAIT, THEN UPDATE
DCI H'872' DISABLING INT. AT SAME TIME
LI H'82'
ST TURN OFF MESSAGE OBJECT
LISU 4
LISL 4
LI H'30'
LR D,A SET DELTA LINE
LIS H'3'
LR S,A SET LEVEL
PI SNE ENABLE SOUND
LIS H'F'
LR 6,A SET DURATION
FLS1 PI WAUD WAIT, THEN UPDATE
DS 6
BNZ FLS1 BEEPED LONG ENOUGH?
PI DAI YES, DISABLE SOUND
LIS H'5'
LR 6,A SET BLINK COUNT
FLS2 DCI TRE2
PI RASC GET BOARD AFTER PLAYER MOVE
DCI H'0E30' DCO TO TEMP AREA
LR Q,DC SAVE ADDRESS
PI SCRA SCRATCH TO RAM, REVERSED
LR DC,Q RECOVER ADDRESS
PI RASC AND INTO SCRATCHPAD
PI WAUD NOW DO UPDATE
PI ENIN
PI BORD DISPLAY BOARD
LI H'20'
LR 3,A SET COUNTER
FLS3 PI MWAD WAIT A BIT
DS 3
BNZ FLS3
DCI TREE
PI RASC BOARD AFTER MACHINE MOVE
PI ENIN
PI BORD DISPLAYED
LI H'20'
LR 3,A
FLS4 PI MWAD WAIT A MOMENT
DS 3
BNZ FLS4
DS 6
BNZ FLS2 DONE ENOUGH TIMES?
BR FLS6 YES,GOTO PLAYER MOVE
ORG H'1800' SELE
SELE LISU PLOC
LISL 0
LR DC,H
LIS H'C' To get MOVE byte
ADC
LM
LR 0,A Save it temporarily
NS 0 To set status byte
BNZ SEL3
JMP NEXT To get next MOVE byte
SEL3 CLR
COM -1 in A
ADC Get back to move byte
AS 0
NS 0 Remove right-most on-bit
ST Put remaining bits back (and index)
XS 0 This gets the extracted bit
LR 6,A Save it in 6
LM Now get the byte designation
SEL4 LR 5,A
SR 1
SR 1
NI H'3' Separate the byte indicator part
LR 4,A Save it in 4
LR A,5
NI H'13' Separate the JUMP bit and the direction
LR 5,A Save them in 5
DELE LI ISA Process Active and Kings for source dele
AS 4 Add byte #
LR IS,A Get to initial byte
LR A,S
LR 3,A
XS 6 Delete moving piece
LR S,A from byte
LISU KLOC To get to corresponding KING byte
LR A,S
NS 6 Was the piece a king?
BZ DEL2
XS S If it was delete king bit
LR S,A
LIS H'7' Non-zero in 2 for king
DEL2 LR 2,A 0 for man, 7 for king, (later 1 for prom
LISU PLOC Back to active section
*Now locate captured piece if jump or find destination in normal move
LR A,6 Recall MOVE bit
SR 4
BZ INRH Bit was in right half of byte
INLH LR 3,A Save partially shifted MOVE bit
LIS H'1' Get direction
NS 5 To test right-most bit
BZ INL2 RF or LB move where 4 shift is correct
LR A,3
SR 1 LF and LB require an additional shift
LR 3,A
INL2 LIS H'2' Now test for fore or aft
NS 5
BZ BOTH Forward move, no byte shift needed
LR A,D Only to decrement ISAR
INL3 BR BOTH
*
INRH LR A,6 Get MOVE bit again
SL 4 Left shift if in right half
LR 3,A Save partially shifted MOVE bit
LIS H'1'
NS 5 Get direction
BNZ INR2 LF or LB where 4 shift is correct
LR A,3
SL 1 RF and RB require an additional shift
LR 3,A
INR2 LIS H'2' Now test fore and aft
NS 5
BNZ BOTH
LR A,I Only to increment ISAR
BOTH LR A,5 Now is this a jump or a normal move?
*ISAR still points to active region but may designate
*an empty square or the capture square
SR 4 Set status for jump bit
BNZ JUMP
JMP NORM It's a normal move
JUMP LR A,IS
AI H'4' To get to passive pieces
LR IS,A
LR A,S
XS 3 Remove captured piece
LR S,A
LR A,IS
AI H'4' Corresponding king location
LR IS,A
LR A,S Get byte
NS 3 Is the piece a king?
BZ JUM1 No
XS S Yes, Remove it
LR S,A
LIS H'2'
COM Fast -3
BR JU11
JUM1 LIS H'1'
COM Fast -2
JU11 LR 0,A
LI PASM
LR IS,A
LR A,S
AS 0
LR S,A
JU12 LI ISA Back to moved-from location
AS 4 Byte number is in 4
LR IS,A
LIS H'2'
NS 5 Test for fore or aft
BZ JUMA Fore move
LR A,D Decrement ISAR (destination always in ne
BR JUMB
JUMA LR A,I Increment ISAR
JUMB LR A,IS Get the destination byte off-set
AI H'E8' by subtracting O'30' from ISAR value
LR 4,A needed if there is a continuation
LIS H'1' Get direction
NS 5 Test for right or left
LR A,6 Get original pieceocation
BZ JUM2 0 for R move, ≠0 for L move
SR 1 Left moves involve a right shift of 1
BR JUM3
JUM2 SL 1 Right moves involve a left shift of 1
JUM3 LR 3,A Save bit byte in 3, freeing 6 for other
LR 1,A As mask in FIND for continuation
LR A,S
XS 3 Set piece down
LR S,A
CLR
AS 2 Was the piece a king?
BZ JUMC No, might be a promotion
CLR
LR 0,A Temporary record of promotion credit
BR JUM6 Already a king so no promotion
JUMC LIS H'2'
NS 5 Which side is active
LR A,IS
BZ JUM4 0 if forward
CI O'30' Is this byte 0?
BNZ JU71 No, so no promotion
LIS H'F' and t king row?
SL 4
BR JUM5 Promotion indicated, no double jump
JUM4 CI O'33' Is this byte 3?
BNZ JU71 No, so no promotion
LIS H'F' and the king row?
JUM5 NS 3
BZ JU71 No
LIS H'1' 1 for promotion
LR 2,A It was 0
LR 0,A Credit for promotion
LR 6,A Used in FIND for no continuation
JUM6 LISU KLOC Get to King position
LR A,S
AS 3 Put down e king
LR S,A
CLR
XS 0 Was there a promotion?
BZ JU71 No
LISU 4
LISL 6
LR A,S
INC Add for promotion
LR S,A
BR JUM9 Can be no continuation if promotion
JUM7 CLR
XS 0 Should we check for a double jump?
BZ JU71 Yes, a 0 means no promotion
JUM9 JMP FORE
* Set up conditions to try to find a continuation
JU71 LR A,HL
SR 4
CI H'C' Is there room?
BM JUM9 No
CI H'1' Is this a player's board?
BNZ JU78 No
DCI PLMV Yes, restart PLMV
CLR
ST
BR JU77 and keep to this level
JU78 DCI MOBS GET MOVE COUNT
AI -H'2'
ADC
LM
LR 2,A
CLR MOBILITY FOR PASSED BOARD
ST TO ZERO TO PREVENT COMPRESS
LR DC,H
LI H'1C' Get to byte location
ADC in the "passed board" position
LR A,3 Save destination info
ST the move byte
LR A,4
ST and the byte #
CLR
COM and a flag of -1
ST in the ACTM position
LR A,2 and # of moves in PASM
ST
LR A,HL
SR 4
DCI SCOR Advance score
AI -H'3' To get score for passed board as well
SL 1
BP JU72 Is it save to back this far?
LIS H'2' No, so take care of passed board
ADC
LI H'C1'
ST
LIS H'1'
ST
DCI SCOR
BR JU73
JU72 ADC
JU73 LR Q,DC
XDC
LR DC,Q
LIS H'4'
ADC
LIS H'4'
LR 0,A
JU74 XDC
LM
XDC
ST
DS 0
BNZ JU74
LIS H'2' Copy data two blocks forward
SL 4
AS HL
LR HL,A
JU77 LR DC,H
PI SCRD SC to RA direct
PI EMPT Re-do to reflect changes
LR A,3 Save destination
LR 1,A as mask for FIND
CLR
LR 2,A
LR 6,A
JMP RFJ Find continuations if any
* NORM FORE
*Now make normal move
NORM LR DC,H Back in step
CLR
LR 0,A Flag for no promotion
LISU PLOC Get back to Active pieces
LR A,S LISL still OK
AS 3
LR S,A Put in moved piece
LR A,2 Was it a kin
NS 2
BNZ NOM6 Yes so don't promote but do put king dow
LIS H'2'
NS 5 Test for direction
LR A,IS
BZ NOM4 Is it going forward?
CI O'30' Did it get to the byte 0?
BNZ FORE No
LIS H'F' and in king row?
SL 4
BR NOM5 Mark for promotion
NOM4 CI O'33' Did it get to byte 3?
BNZ FORE No
LIS H'F' and in king row?
NOM5 NS 3
BZ FORE No
LIS H'1'
LR 0,A A promotion flag
NOM6 LISU KLOC Now get to king byte
LR A,S Get corresponding king byte for destinat
AS 3 Insert king
LR S,A And replace byte
CLR
AS 0
BZ FORE
LI ACTM Get to active material location
LR IS,A
LR A,S
INC Credit for promotion
LR S,A
FORE DCI CFLG Have we compacted?
CLR
AM
BZ FORX
LIS H'2'
FORX LR 0,A Save value to add
LR A,HL Where are we?
SR 4
CI H'1'
BNZ FOR8
JMP FOR5 Player's move has been made
FOR8 LR A,7
COM Change color
LR 7,A
LIS H'1'
SL 4
AS HL
LR HL,A
LR DC,H GET back in step
PI SCRA Prepare for normal advance
LR A,HL Can we advance score?
SR 4
CI H'3' Note HL has already be advanced
BM FOR2 Advance score normally
BNZ FOR4 Special case
DCI SCOR+2
LI H'C1'
ST
LIS H'1'
ST
BR FOR4 May still be a special case
FOR2 AI -H'2' Scor not saved for HL=10
SL 1 Scores take 2 bytes each so *2
DCI SCOR
ADC Current location
LR Q,DC
XDC
LR DC,Q
LIS H'3'
COM Fast -H'4'
ADC Get to earlier entry
LM Copy it
XDC
ST
XDC
CI H'C1'
LM
XDC
BNZ FOR7
LR A,HL Record for win or lose reporting
SR 4
AI -H'2'
AS 0
FOR7 ST
* Compacting routine to save space. Note this
* complicates reporting of win and lose distances.
DCI TRE3 LOCATION OF LEVEL 30 PASSED FLAG
CLR
XM
BM FOR3 DONT COMPRESS THIS CASE
LR A,HL
SR 4
CI H'7' Room to compact?
BP FOR3 No, let player make his next move
AI -H'4' 2 back in MOB
DCI MOBS Compacting possible only if but
ADC single moves available for 2
LM successive moves
CI H'1'
BNZ FOR3 More than 1 move
LM
CI H'1'
BNZ FOR3 More than 1 move
LR A,HL
SR 4
AI -H'4' Back 2 levels
SL 1
DCI SCOR
ADC
LM
CI H'C1'
BNZ FORY
LR Q,DC
LIS H'2'
AM
LR DC,Q
ST Overwrite with higher value
FORY LIS H'1'
COM Back up 2 levels
SL 4
AS HL
LR HL,A
DCI CFLG
LR A,HL
SR 4
ST Set flag for SCOR check
LR DC,H GET back in step
PI SCRA Prepare for normal advance
FOR3 JMP FIND Go forward normally
FOR4 DCI SELX
LR Q,DC
LM
CI H'1'
BM FOR3 Normal play
INC Book or random move has been made
LR DC,Q
ST so count thias a move
CLR Clear start of PLMV list for
DCI PLMV listing player's possible moves
ST
LR DC,H
XDC
DCI TREE Prepare for TRAN
LR H,DC
LIS H'1'
SL 4
LISU 2
LISL 0
LR S,A
PI TRAN
JMP FIND FIND exits to PMOV when HL is H'10'
FOR5 PI BORD Show board after players move
LIS H'4' "MY MOVE"
LR 0,A
PI WMC
DCI SCOR Start scores off at H'C100'
LI H'C1' so that CM's will always work
ST
CLR
ST
LI H'C1'
ST
LIS H'1'
ST
LR A,7
COM Change color
LR 7,A
DCI TRE2 Set for machine's first move
LR H,DC
PI SCRA SC to RA with sides reversed
LR DC,H
PI RASC RA to SC preparing for a normal move
DCI SELX
LR Q,DC
LM
INC Add 1 to move count
LR DC,Q
ST
CI H'1'
BZ FOR6 Use stored move
JMP FIND Go find normal reply
FOR6 LISU 2 Get random number
LISL 5
LIS H'3'
NS S 0 to 3 random number
LR 0,A
SR 1
LR 1,A 0 to 1 random number
LIS H'1'
NS 0
LR 0,A 2nd 0 to 1 random number
* Machine to make 2nd move from book
DCI BKMV Get stored move munber
LM
SL 1 X2, 2 entries for each input move
AS 0 Random choice between them
DCI BOK2 Stored table of book replies
ADC
LM Get reply number
LR 0,A
CLR Use second number to select which half
XS 1
LR A,0
BZ BMV2
SR 4
BMV2 NI H'7'
LR 0,A The final selection
DCI REDM Possible Red moves
BM17 LM Get byte record
LR 1,A
BM18 LR A,1
NS 1
BNZ BM19 Is this byte exhausted?
LM Step over byte info
BR BM17 Go to next byte record
BM19 LR 2,A
AI H'FF' Subtract 1
NS 1
LR 1,A byte less rightmost bit
XS 2 This leaves 1 bit in A
DS 0
BP BM18
LR 6,A Save the byte bit
LM Get the byte info
LR 4,A The byte indicator
LR DC,H
LIS H'C'
ADC
LR A,6
ST
LR A,4
ST
JMP SELE
* RASC SCRA FKT STMV
*-*-*- RASC RAM to SC transfer
RASC LR K,P RAM to SC
LISU PLOC ←SC buffer with Active and Passive
LISL 0
RAS2 LM
LR I,A
BR7 RAS2
LM
LR I,A
LISU KLOC
RAS3 LM
LR I,A
BR7 RAS3
LM
LR I,A
PK
* SCRA SC to RAM with side reversal
SCRA LR K,P SC to RAM for side reversal
LISU PLOC
LISL 4
LIS H'8'
LR 0,A
SCR1 LR A,I
ST
DS 0
BNZ SCR1
LISU KLOC
LISL 0
LIS H'4'
LR 0,A
SCR2 LR A,I
ST
DS 0
BNZ SCR2
CLR
ST
ST
LISL 7
LR A,D
ST
LR A,D
ST
PK
*-*-*- Test if Kings only can move
FKT LR K,P
CLR
AS 7
BNZ FK1 Only kings in this direction
FKT2 CLR
XS 3
PK Normal pieces OK
BKT LR K,P
CLR
AS 7 Test sides for backward move
BNZ FKT2 NORMAL pieces can move
FK1 LIS H'2'
SL 4
AS 4
LR IS,A KINGS only can move
LR A,S
NS 3
LR 3,A
PK
*Subroutine to add to MOBILITY, and to store MOVE and FLAG bytes if nece
STMV LR K,P
LR A,HL
SR 4
CI H'01' Is this the player's board
BNZ STM3 No
DCI PLMV Player's moves stored separately
STM0 CLR
XM
BZ STM1 Find empty space
LM Skip info space
BR STM0 Try again
STM1 CLR Back up
COM
ADC
LR A,3
ST
LR A,4
SL 1
SL 1
AS 5
ST
CLR
ST Store 0 as stop
BR STM2
STM3 CLR
XS 2 To set status byte
BNZ STM2 One is already stored
LR DC,H Get back in step
LIS H'C' To get to MOVE byte
ADC
STM4 LR A,3 Get move byte
ST Store it in RAM
LR A,4 Get the byte pointer
SL 1
SL 1
AS 5
ST Put this into RAM
LR DC,H May be necessary
STM2 CLR
LR 0,A To accumulate count
LR A,3
STM5 DS 0
AI H'FF'
NS 3 Removes rightmost bit
LR 3,A
BNZ STM5
LR A,0
COM
INC
AS 2 Add in previous count
LR 2,A
PK
* NEXT FIND RFJ LFJ RBJ LBJ
NEXT PI EMPT Needs redoing if came to SELE via AFT
LR DC,H
LR A,HL
SR 4
CI H'3'
BP NEXX Can not be a continuation
LIS H'3' Look to earlier board data
COM Fast -4
ADC
LM
LR 1,A Get move byte just in case
LM
LR 4,A and byte info
CLR
LR 2,A
XM Now look at ACTM
BP NEXX Not a continuation board
LR DC,H
LIS H'D'
ADC
LIS H'3' Get last used direction
NM
INC
CI H'3'
BM NEXY Last direction used
LR 5,A
CLR
LR 2,A Set move count to zero
COM
LR 6,A Set continuation flag
JMP RBJ0
NEXX LR DC,H
LIS H'D' Last used byte info
ADC
LM
LR 5,A
NI H'F'
INC
LR 0,A
CI H'F' Is this the last byte and direction?
BP NEXA
NEXY JMP AFT Yes, so back up
NEXA LR DC,H
LIS H'1' Set to 1 for normal back-up
LR 6,A
CLR
LR 2,A Reset move count
COM
LR 1,A All pieces allowed to move
LR DC,H
LR A,0
SR 1
SR 1
NI H'3'
LR 4,A
LR A,5
CI H'F'
LIS H'3'
BM NEXJ Jumps required
NS 0
LR 5,A
BZ NEN0
JMP RBN0
NEN0 JMP RFN
NEXJ NS 0
LR 5,A
BZ NEJ0
JMP RBJ0
NEJ0 JMP RFJ
*We enter here on going forward
FIND LR DC,H
LR A,HL
SR 4
CI H'2'
BNZ FIN1
LIS H'E' Compute ACTM+PASM+9
ADC
LIS H'9' Constant term
AM
AM
DCI AP20 Used by EVAL to compute MAT
ST
LR DC,H
FIN1 PI RASC Get board into SC
PI EMPT Compute the empty squares
CLR
LR 4,A Start with byte 0
LR 2,A Mobility count and move-found flag
LR 6,A So all moves will be found
COM
LR 1,A To find all possible jump moves
RFJ LI ISA Active pieces
AS 4 Add byte off-set
LR IS,A Get to byt←
LR A,S
NS 1 FF if normal, 1 bit only for continuatio
LR 3,A 3 used to develop final byte
PI FKT Any forward moving pieces?
BZ RBJ No, look to backward moving
LI ISE+1 Look to empty squares forward
AS 4 Add byte off-set
LR IS,A Dtination byte location
LR A,S
SR 1
NS 3
LR 3,A Only pieces that have place to land
LI ISP Passive pieces
AS 4
LR IS,A
LR A,I Look to RF passive pieces forward
SL 4 In front of ft-most bits
LR 0,A
LR A,S
SR 4 In front of right-most bits
SR 1
AS 0
NS 3
LR 3,A Pieces that can jump RF
BZ LFJ None was found
LIS H'1' The RFJ direction and J indicator
SL 4
LR 5,A
PI STMV Store move byte and info
CLR
AS 6 Recall indicator
BNZ LFJ2
LFJ LI ISA
AS 4 Add byte off-set
LR IS,A Get to initial byte
LR A,S
NS 1 FF if normal, 1 bit only for continuatio
LR 3,A
PI FKT
LI ISE+1 Empty squares forward
AS 4
LR IS,A
LR A,S
SL 1
NS 3
LR 3,A Only pieces that have a place to land
LI ISP
AS 4
LR IS,A
LR A,I
SL 4
SL 1
LR 0,A
LR A,S
SR 4
AS 0
NS 3
LR 3,A Pieces that can jump LF
BZ RBJ
LI H'11' The LFJ direction and J indicator
LR 5,A
PI STMV
CLR
XS 6
BZ RBJ
LFJ2 BR RBJ2
RBJ0 LR A,5
CI H'2' Which direction, 1, 2, or 3?
BM LBJ It was a 3
BNZ LFJ It was a 1
RBJ LI ISA
AS 4 Add byte off-set
LR IS,A Get to initial byte
LR A,S
NS 1 FF if normal, 1 bit only for continuatio
LR 3,A
PI BKT Any backward moving pieces?
BZ FJ1 No
LI ISE-1 Look to empty squares backward
AS 4
LR IS,A
LR A,S
SR 1
NS 3
LR 3,A
LI ISP-1 Look to passive pieces backward
AS 4
LR IS,A
LR A,I
SL 4
LR 0,A
LR A,S
SR 4
SR 1
AS 0
NS 3
LR 3,A Pieces that can jump RB
BZ LBJ
LI H'12' The RBJ direction and J indicator
LR 5,A
PI STMV
CLR
XS 6
RBJ2 BNZ LBJ2
LBJ LI ISA
AS 4 Add byte off-set
LR IS,A Get to initial byte
LR A,S
NS 1 FF if normal, 1 bit only for continuatio
LR 3,A
PI BKT
LI ISE-1 Empty squares backward
AS 4
LR IS,A
LR A,S
SL 1
NS 3
LR 3,A
LI ISP-1 Look to passive pieces backward
AS 4
LR IS,A
LR A,I
SL 4
SL 1
LR 0,A
LR A,S
SR 4
AS 0
NS 3
LR 3,A Pieces that can jump LB
BZ FJ1
LI H'13' The RBJ direction and J indicator
LR 5,A
PI STMV
CLR
XS 6
BZ FJ2 We want them all
LBJ2 JMP SELE A successful NEXT
FJ1 CLR No backward moves
XS 6
BZ FJ2 We want them all
BP FJ3 Try next byte
JMP AFT A NEXT continuation failure
FJ2 LR A,1 Was it a first continuation try?
CI H'FF'
BNZ FJ4 Yes
FJ3 LR A,4 No, to next board byte
INC
NI H'3'
LR 4,A
BZ FJ9 There are no more
JMP RFJ Go round again for next byte
FJ4 CLR A first continuation try
XS 2 Was it successful?
BZ FJ5 No
* Successful continuation try
LR A,HL
SR 4
CI H'5' Where are we?
BM FJ7 Could be a second continuation
CI H'1' A ayer's board
BNZ FJ10 No
PI BORD Show board
JMP DJMP
* Unsuccessful continuation try
FJ5 LR A,HL
SR 4
CI H'1' A player's board
BM FJ6 No
JMP FOR5 "MY MOVE" etc
FJ6 LIS H'1' Back 2 levels
COM
SL 4
AS HL
LR HL,A
JMP FORE
*SUCCESSFUL CONTINUATION THAT MIGHT BE
*COMPACTED
FJ7 CI TRE3
CLR
XM
BM FJ10
LR DC,H
LI H'FF'
ADC
LM
CI H'1'
BM FJ10
LR DC,H No, so we can move data
XDC back by 2 levels
LIS H'1' and so save space
COM A fast -2
SL 4
AS HL
LR HL,A
LR DC,H
LISU 2
LISL 0
LIS H'1'
SL 4
LR S,A
PI TRAN
FJ8 LR A,HL
SR 4
BR FJ11
* All bytes exhausted
FJ9 CLR
XS 2
BNZ FJ10 Jumps found
CLR
XS 6 Go to normal moves?
BZ RFN Yes
JMP AFT No more jumps
FJ10 LR A,HL
SR 4
CI H'E'
BM FJ12 Too bad, out of space
CI H'1'
BNZ FJ11 Not player's FIND
JMP FLSH FLASH MOVE
FJ11 AI -H'2'
DCI MOBS
ADC
LR A,2
ST
LR DC,H Prepare for continuation
LI H'1E' To ACTM in passed board
ADC These data are over-
CLR written if no continuation
COM A -1 signals
ST a continuation
LR A,2 A 1 here signals
ST a single jump case
JMP SELE
FJ12 LISU KLOC Correct PASM and stop
LISL H'7'
LIS H'1' Allow for a piece capture
COM A fast -2
AS S
LR S,A
JMP EVAL
RFN LI ISA
AS 4 Add byte off-set
LR IS,A Get to initial byte
LR A,S
LR 3,A
PI FKT
BZ RBN
LI ISE Start of empty region
AS 4 Add off-set
LR IS,A
LR A,I Look to RF empty squares
SL 4
LR 0,A
LR A,S
SR 4
SR 1
AS 0
NS 3
LR 3,A Pieces that can move RF
BZ LFN
CLR
LR 5,A
PI STMV
CLR
XS 6
BZ LFN
JMP SELE
LFN LI ISA
AS 4 Add byte off-set
LR IS,A Get to initial byte
LR A,S
LR 3,A
PI FKT
BZ RBN
LI ISE Start of empty region
AS 4 Add off-set
LR IS,A
LR A,I Look to LF empty squares
SL 4
SL 1
LR 0,A
LR A,S
SR 4
AS 0
NS 3
LR 3,A Pieces that can move LF
BZ RBN
LIS H'1'
LR 5,A
PI STMV
CLR
XS 6
BZ RBN
JMP SELE
RBN0 LR A,5
CI H'2' Which direction 1, 2 or 3?
BM LBN It was a 3
BNZ LFN It was a 1
RBN LI ISA
AS 4 Add byte off-set
LR IS,A Get to initial byte
LR A,S
LR 3,A
PI BKT
BZ NORT
LI ISE-1
AS 4 Add off-set
LR IS,A
LR A,I Look to RB empty squares
SL 4
LR 0,A
LR A,S
SR 4
SR 1
AS 0
NS 3
LR 3,A Pieces that can move RB
BZ LBN None can
LIS H'2'
LR 5,A
PI STMV
CLR
XS 6
BNZ NORF
LBN LI ISA
AS 4 Add byte off-set
LR IS,A Get to initial byte
LR A,S
LR 3,A
PI BKT
BZ NORT
LI ISE-1
AS 4 Add off-set
LR IS,A
LR A,I Look to LB empty squares
SL 4
SL 1
LR 0,A
LR A,S
SR 4
AS 0
NS 3
LR 3,A Pieces that can move LB
BZ NORT
LIS H'3'
LR 5,A
PI STMV
CLR
XS 6
BZ NORT
NORF JMP SELE
*We get here if we want to compute mobility and also if no moves found
NORT LR A,4
INC
NI H'3'
LR 4,A
BZ NOR0
JMP RFN Go round again for next byte
NOR0 CLR
XS 2 Get mobility count
BZ AFT No moves found
NOR1 LR A,HL Where are we?
SR 4 Get Ply number
CI H'1'
BNZ NOR2 Checking for possible player's moves?
JMP FLSH FLASH MOVE
NOR2 CI H'D' Are we out of space?
BM NOR4 Yes
AI -H'2' To index MOBS
LR 0,A
DCI PLY0 Neg. of allowed MOB sum
LM
DCI MOBS
BR NOR5
NOR3 AM Add up mobilities
NOP Space for INC if needed
NOR5 DS 0
BP NOR3
AS 2 Add in the current one
BM NOR7 Not time to stop
LR A,HL
CI H'30' Don't stop at 30 ever
BNZ NOR4 Time to stop
NOR7 LR A,2
ST Save latest mobility
NOR6 JMP SELE and go on
NOR4 JMP EVAL
* AFT
*MAT EQU H'0' Register used for Material Adv. term
*POT EQU H'6' Register used for Positional Adv. term
*Defined earlier
*HLS EQU H'4' Register to save HL off-set
*No more moves found so time to back up
AFT LR A,HL Prepare to back up
SR 4
CI H'2'
BNZ AFT0 Not at end of tree search
*Prepare for verification of player's reply
JMP STOP
AFTT DCI TREE
LR H,DC BACK TO PLAYER'S BOARD
LR A,7
COM Reverse sides
LR 7,A
DCI PLMV This spe is also used by TREE routine
CLR Clear first byte
ST
JMP FIND Get verification info for move
AFT0 AI -H'2' SCOR not saved for HL=10
SL 1 2 bytes per entry
DCI SCOR
ADC
LR Q,DC
LM
LR MAT,A The current material advantage term
LM
LR POT,A The current positional term
AFTE LR A,HL
CI H'30'
BNZ AFT1 Must test for double jump and continuati
DCI SCOR
LR Q,DC
LIS H'1'
LR 1,A So board can be saved if indicated
JMP AP2X Can handle with -2 passed case
AFT1 LR DC,H EVAL enters here
LIS H'1' Neg. ACTM for passed board
COM Fast -2
ADC
CLR
XM Is -1 board passed
BM AFP1 Yes
LI H'EF' Is -2 board passed
ADC
CLR
XM
BM AFP2 Yes
* -1 and -2 boards not passed
LR A,HL
SR 4
AI -H'2'
LR 1,A Back 2 from current HL
AI -H'2'
SL 1
DCI SCOR
ADC
LR Q,DC
BR AP2Y General routine can now handle
* -1 board is passed so this was a multiple jump
AFP1 PI AFBX
LIS H'1'
AS 1
LR 1,A
LIS H'2'
ADC
LR Q,DC
LR A,MAT
CM
BM AP12 Back score for sure
BNZ AP13 Do not back score
LR A,POT
CM
BP AP13 Do not back
AP12 LR DC,Q Back score here
LR A,MAT
ST
LR A,POT
ST
AP13 JMP AF2B Back H by 2
* -2 board is passed so backing int? a continuation
AFP2 PI AFBX
LR A,1
CI H'1'
BZ AP22 Can't prune and may need to save board
* Will handle normal both normal and backing into continuation cases
AP2Y LR A,MAT
CM
BM AP22 Can't prune
BNZ AP21 Can prune
LR A,POT
CM
BM AP22 Can't prune
AP21 LR A,1 Prune around multiple jump
SL 4
LR HL,A
JMP ABBB Prepare for SELE
AP22 LI H'2' Forward 1 level
LR DC,Q
ADC
LR Q,DC We may need to save score
AP2X LR A,POT
COM
INC
LR POT,A
LR A,MAT
COM
INC
LR MAT,A
CM
BM AP23 Can back score
BNZ AF1B Can't back score
LR A,POT
CM
BP AF1B Can't back score
AP23 LR DC,Q Back score
LR A,MAT
ST
LR A,POT
ST
LR A,1 Should the board be saved?
CI H'1' Was 30 passed?
BNZ AF1B No, back 1 level in HL
LR DC,H Yes
XDC
DCI TREE
LISU 2
LISL 0
LIS H'1'
SL 4 Fast H'10'
LR S,A
PI TRAN Save board
BR AF1B and back 1 level
* Final backing up
AF2B LIS H'E' Back 2 levels
SL 4 Fast H'E0'
BR AFBB
AF1B LR A,7 Reverse sides and back 1 level
COM
LR 7,A
LIS H'F' Back 1 level
SL 4 Fast H'F0'
AFBB AS HL
LR HL,A
ABBB LR DC,H
PI RASC
DCI CFLG
LR A,HL
SR 4
CM
BM ABBC
CLR
DCI CFLG
ST Clear compacting flag
ABBC JMP SELE
* Subroutine to back by 2's to non-passed board
AFBX LR K,P
LI -H'1'
ADC To ACTM location
LR Q,DC
AFB2 LR DC,Q
LIS H'1'
COM
SL 4 Back by H'20'
ADC
LR Q,DC
CLR
XM
BM AFB2 Go around again
LR A,QL
SR 4
LR 1,A Save to get new HL value
AI -H'2'
SL 1 2 bytes per entry, remember
DCI SCOR
ADC
LR Q,DC Q points back 2 from first passed
PK
* EVAL
* HLS used temporarily in multiply routine
EVAL LISU 4 Compute the material advantage term
LISL 6 Get to ACTM
LR A,I
LR MAT,A ACTM
LR A,I
LR HLS,A PASM
COM
INC
AS MAT
LR 3,A ACTM-PASM
BP EVA0
COM
INC
EVA0 LR 1,A |A-P|
LR A,MAT
AS HLS A+P
COM
INC -(A+P)
DCI AP20
AM Add initial value +6
SR 1 and divide by 2
LR HLS,A Save temporarily, multiply by
CLR by smaller pos. # in 1
LR MAT,A Product into MAT
LR A,1
EVA1 NI H'1' Is the rightmost bit a 1?
BZ EVA2 No
LR A,HLS
AS MAT
LR MAT,A
EVA2 LR A,HLS
SL 1
LR HLS,A
LR A,1
SR 1
LR 1,A
BNZ EVA1 Product is not complete
LR A,MAT
CI H'33' Maximum of 51
BP EV21
LI H'33' Limit range to avoid CM trouuble
LR MAT,A
EV21 CLR
XS 3 To get sign
LR A,MAT
BP EVA3
COM
INC
LR MAT,A Material advantage with sign
* Compute guard row credit
LISU PLOC
CLR
LR 3,A
XS 7
BZ EVG2 Black is active
LISL 4 Passive's (black's) guard byte
LIS H'A'
SL 4 Passive's guard bits
NS S Are pieces there?
LR 1,A
AI H'FF'
NS 1 Both of them?
BZ EVG1 No
CLR
COM Debit
LR 3,A
EVG1 LISL 3 Active's (red's) guard byte
LIS H'5' Active's guard bits
NS S Are pieces there?
LR 1,A
AI H'FF'
NS 1 Both of them?
BZ EVG4 No
LR A,3
INC
LR 3,A Credit
BR EVG4
EVG2 LISL 7 Passive's (red's) guard byte
LIS H'5'
NS S Are pieces there?
LR 1,A
AI H'FF'
NS 1 Both of them?
BZ EVG3 No
CLR
COM Debit
LR 3,A
EVG3 LISL 0 Active's (black's) guard byte
LIS H'A'
SR 4 Active's guard bits
NS S Are pieces there?
LR 1,A
AI H'FF'
NS 1 Both of them?
BZ EVG4 No
LR A,3
INC Credit
LR 3,A
EVG4 LR A,3
SL 1 Credit of 2, 0 or -2
AS MAT Add to MAT
LR MAT,A
* Center credit
CLR
LR 3,A
LISL 5 Start with passive
EVD0 LI H'66' These squares
NS I Are they occupied?
BZ EVD2 No
EVD1 LR 1,A Count them
DS 3
CLR
COM
AS 1
NS 1
BNZ EVD1
LR A,IS
NI H'1' Can we consider next byte?
BZ EVD0 Yes
EVD2 LR A,3
AS MAT Debit for passive occupancy
LR MAT,A
CLR
LR 3,A
LISL 1 Now for active's bytes
EVD3 LI H'66' These squares
NS I Are they occupied?
BZ EVD6 No
EVD5 LR 1,A Count them
DS 3
CLR
COM
AS 1
NS 1
BNZ EVD5
EVD6 LR A,IS
NI H'1' Can we consider the next byte?
BZ EVD3 Yes
EVD8 LR A,3
COM
INC Credit for active occupancy
AS MAT
LR MAT,A
* Now the second SCOR term
EVA3 LR A,HL
SR 4
AI -H'2'
LR 5,A Save PLY
DCI MOBS Compute mobility term
AI -H'1'
ADC
LM Get earlier mobility
COM
INC
AS 2 Add current mobility
CI H'C' Difference limited to |12|
BP EVA4
LIS H'C'
EVA4 CI -H'C'
BM EVA5
LI -H'C'
EVA5 SL 1 Make room for ply term
SL 1 Would like to shift more
LR POT,A Save difference (and free 2)
CLR
AS MAT
BNZ EVA6
CLR
AS POT
EVA6 LR A,5 Get ply value
BM EVA7 Test sign of significant term
COM If pos. we add H'C'-PLY
INC
AI H'C'
BR EVA8
EVA7 AI -H'C' If neg. we add PLY-H'C'
EVA8 AS POT Add it in
LR POT,A Positional term with PLY
EVA9 LR A,HL
SR 4
AI -H'2'
SL 1
DCI SCOR
ADC
LR Q,DC
JMP AFTE AFT routine handles from here on
EMPT LR K,P Empty squares in O'51' thru O'54'
LISU ELOC with guard bytes in 50 and 55
LISL 0
CLR
LR S,A Make sure guard byte is empty
LISU PLOC Start with ACTIVE
LIS H'4'
LR 0,A
BR EMP3
EMP2 LR A,IS
AI H'30' Actually subtracting 16
LR IS,A
EMP3 LR A,S
LR 1,A
LR A,IS
AI 4
LR IS,A
LR A,S
AS 1
LR 1,A
LR A,IS
AI H'D' Add 13 get to the correct EMPTY locat
LR IS,A
LR A,1
COM Reverse 1's and 0's
LR S,A
DS 0
BNZ EMP2
LR A,I To index only
CLR
LR S,A Upper guard byte
PK
*
KING DC B'01011010' KING'S CROWN
DC B'00111100'
DC B'00011000'
REDP DC B'00111100' RED PIECE
DC B'01111110'
DC B'01111110'
DC B'01111110'
BLKP DC B'00111100' BLACK PIECE
DC B'01000010'
DC B'01000010'
DC B'01000010'
DC B'00111100'
*=*=*=*=*=*=*=*=*=*
*PLAYER WIN TUNE *
*=*=*=*=*=*=*=*=*=*
TUN2 DC H'2403'
DC H'78'
DC H'4003'
DC H'1F'
DC H'3C03'
DC H'1E'
DC H'3507'
DC H'1E'
DC H'3003'
DC H'1E'
DC H'2D03'
DC H'1E'
DC H'2807'
DC H'5A'
DC H'3C03'
DC H'0F'
DC H'3507'
DC H'0F'
DC H'3003'
DC H'1E'
DC H'3C03'
DC H'1E'
DC H'3C03'
DC H'1E'
DC H'5007'
DC H'0F'
*=*=*=*=*=*=*=*=*=*=*
*COMPUTER WIN TUNE *
*=*=*=*=*=*=*=*=*=*=*
TUN1 DC H'2807'
DC H'2D'
DC H'2003'
DC H'0F'
DC H'1E03'
DC H'0F'
DC H'2003'
DC H'0F'
DC H'2403'
DC H'0F'
DC H'2807'
DC H'1E'
DC H'1E03'
DC H'0F'
DC H'2003'
DC H'1E'
DC H'2807'
DC H'2D'
DC H'2003'
DC H'0F'
DC H'1E03'
DC H'0F'
DC H'2003'
DC H'0F'
DC H'2807'
DC H'2D'
DC H'2003'
DC H'2D'
END END FOR ASSEMBLER